package net.sf.jOpinionPoll.controller.questionario;

import java.util.HashMap;
import java.util.Map;

import javax.faces.event.ActionEvent;

import net.sf.jOpinionPoll.bundle.MessageFactory;
import net.sf.jOpinionPoll.controller.Controller;
import net.sf.jOpinionPoll.entity.Questao;

public class SelecaoDeTipoController extends Controller {
	private static final long serialVersionUID = 7934910769653245031L;

	private enum QuestaoOutcome {QUESTAO_ALTERNATIVA, QUESTAO_DISSERTATIVA};
	
    private Questao m_Questao;
    
    private TipoDeQuestao m_TipoDeQuestao;
    
    private static enum TipoDeQuestao {
    	DISSERTATIVA("privado.questionario.tipoDeQuestao.dissertativa"),
    	ALTERNATIVA("privado.questionario.tipoDeQuestao.alternativa");
    	
    	private String m_I18n;
    	
    	private TipoDeQuestao(String i18n) {
    		m_I18n = i18n;
    	}
    	
    	public String getI18nName() {
    		return MessageFactory.getMessage(m_I18n);
    	}
    };
    
    public SelecaoDeTipoController() {
    }
    
    /* Questao */
	public Questao getQuestao() {
		return m_Questao;
	}
	
	public void setQuestao(Questao questao) {
		m_Questao = questao;
	}

	public TipoDeQuestao getTipoDeQuestao() {
		return m_TipoDeQuestao;
	}
	
	public void setTipoDeQuestao(TipoDeQuestao tipoDeQuestao) {
		m_TipoDeQuestao = tipoDeQuestao;
	}
	
    public Map<String, TipoDeQuestao> getTipoDeQuestoes() {
    	Map<String, TipoDeQuestao> q = new HashMap<String, TipoDeQuestao>(); 
    	
    	for(TipoDeQuestao tq : TipoDeQuestao.values())
    		q.put(tq.getI18nName(), tq);
    	
    	return q;
    }
    
	private Questao criarQuestao(TipoDeQuestao qout) {
		Questao q;
		switch(qout) {
			case DISSERTATIVA:
				q = (Questao)createBean("entityQuestao");
				break;
			case ALTERNATIVA:
				q = (Questao)createBean("entityQuestaoAlternativa");
				break;
			default:
				q = null;
		}
		
		return q;
	}
    
	/* Listeners */
	public void criarQuestaoListener(ActionEvent evt) {
		setQuestao(criarQuestao(getTipoDeQuestao()));
	}
	
	@SuppressWarnings("unchecked")
	public Enum criarQuestaoAction() {
		switch(getTipoDeQuestao()) {
			case DISSERTATIVA:
				return QuestaoOutcome.QUESTAO_DISSERTATIVA;
			case ALTERNATIVA:
				return QuestaoOutcome.QUESTAO_ALTERNATIVA;
			default:
				return null;
		}
	}
}